package com.zzl.bonds.ticket.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zzl.bonds.ticket.dto.credit.BwBankAddDto;
import com.zzl.bonds.ticket.dto.credit.SupplierAvailableCreditDto;
import com.zzl.bonds.ticket.dto.finance.SupplierCreditAddDto;
import com.zzl.bonds.ticket.dto.finance.SupplierCreditDetailDto;
import com.zzl.bonds.ticket.dto.finance.SupplierCreditUpdateDto;
import com.zzl.bonds.ticket.dto.finance.TicketFinanceAddDto;
import com.zzl.bonds.ticket.entity.SupplierCreditEntity;
import com.zzl.bonds.ticket.entity.TicketFinanceEntity;
import com.zzl.bonds.ticket.entity.TicketOpenEntity;
import com.zzl.general.common.exception.SysException;
import com.zzl.general.common.serurity.entity.User;
import com.zzl.general.common.utils.PageUtils;

import javax.servlet.http.HttpSession;
import java.util.List;
import java.util.Map;

/**
 * 供应商授信额度表,即集团给供应商的额度
 *
 * @author sunpp
 * @date 2022-02-16 14:04:04
 */
@SuppressWarnings("javadoc")
public interface SupplierCreditService extends IService<SupplierCreditEntity> {


    /**
     * 回滚 供应商额度
     *
     * @param enterpriseId 供应商id
     * @param amount       金额
     * @param instityId    金融机构id
     * @param user         登录用户
     * @throws SysException 业务异常
     */
    void rollBackSupplierCredit(String enterpriseId, Double amount, String instityId, User user) throws SysException;

    /**
     * 扣减额度
     *
     * @param openEntity 开立实体
     * @param user       登录用户
     * @throws SysException 业务异常
     */
    void reduceSupplierCredit(TicketOpenEntity openEntity, User user) throws SysException;

    /**
     * 可给当前供应商开票额度
     *
     * @param enterpriseId       供应商id
     * @param financeInstitutyId 金融机构id
     * @param coreCreditId       授信类型
     * @param user               登录用户
     * @return 供应商在金融机构的 可用授信额度
     * @throws SysException 业务异常
     */
    SupplierAvailableCreditDto availableCredit(String enterpriseId, Integer financeInstitutyId, String coreCreditId, User user) throws SysException;

    /**
     * 新增或者 修改 供应商的 开票额度
     * 1. 如果传入的 供应商的开票额度id 则进行 更新 然后新增
     * 2. 否则 进行新增
     *
     * @param bankShowDtos 参数集合
     * @param user         登录用户
     * @throws SysException 业务衣异常
     */
    void updateAndSaveSupplierCredit(List<BwBankAddDto> bankShowDtos, User user) throws SysException;

    /**
     * 分页查询
     *
     * @param params 查询参数
     * @return 分页数据
     */
    PageUtils queryPage(Map<String, Object> params);

    /**
     * 新增
     *
     * @param supplierCreditAddDto 新增实体
     * @param user                 当前登录用户
     * @throws SysException 业务异常
     */
    void saveSupplierCredit(SupplierCreditAddDto supplierCreditAddDto, User user) throws SysException;

    /**
     * 修改
     *
     * @param supplierCreditUpdateDto 修改实体
     * @param user                    当前登录用户
     * @throws SysException 业务异常
     */
    void updateSupplierCreditById(SupplierCreditUpdateDto supplierCreditUpdateDto, User user) throws SysException;

    /**
     * 根据企业id 查找授信额度 以及在 各个金融机构的额度
     *
     * @param enterPriseIds 企业id 集合
     * @return 返回map key 是企业id value 是 该企业的 信用额度
     */
    Map<String, List<SupplierCreditEntity>> getEnterpriseQuota(List<String> enterPriseIds);

    /**
     * 重置融资额度
     *
     * @param enterpriseId 企业id
     * @param user         用户
     * @throws SysException 异常
     */
    void resetSupplierCredit(String enterpriseId, User user) throws SysException;

    /**
     * 新增融资额度
     *
     * @param supplierCreditAddDto 融资额度信息
     * @param user                 用户
     */
    void addFinanceCredit(SupplierCreditAddDto supplierCreditAddDto, User user) throws SysException;

    /**
     * 修改融资授信
     *
     * @param supplierCreditUpdateDto 融资授信
     * @param user                    用户
     */
    void updateFinanceCredit(SupplierCreditUpdateDto supplierCreditUpdateDto, User user) throws SysException;

    /**
     * 分页查询授信额度
     *
     * @param params 条件筛选
     * @param user   用户
     * @return 融资授信列表
     */
    PageUtils querySupplierCreditPage(Map<String, Object> params, User user, HttpSession session);

    /**
     * 融资额度详情
     *
     * @param id 融资额度id
     * @return 融资额度详情
     */
    SupplierCreditDetailDto getFinanceCredit(String id);

    /**
     * 查询融资额度列表
     *
     * @param user 用户
     * @return 融资额度列表
     */
    List<SupplierCreditEntity> getFinanceCreditList(User user);

    /**
     * 融资授信冻结
     *
     * @param ticketFinanceAddDto 融资申请
     * @param user                用户
     */
    SupplierCreditEntity frozenFinanceSupplierCredit(TicketFinanceAddDto ticketFinanceAddDto, User user) throws SysException;

    /**
     * 融资授信重置
     *
     * @param financeEntity 融资申请
     * @param user          用户
     */
    void resetFinanceSupplierCredit(TicketFinanceEntity financeEntity, User user) throws SysException;

    /**
     * 融资授信真实扣减
     *
     * @param financeEntity 融资申请
     * @param user          用户
     */
    void deductFinanceSupplierCredit(TicketFinanceEntity financeEntity, User user) throws SysException;

    /**
     * 重置融资额度
     *
     * @param id   融资额度id
     * @param user 用户id
     */
    void resetFinancingCredit(String id, User user) throws SysException;
}

